﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using jSLApp.Client.ApplicationBase;
using jSLApp.Client.MainService;
using jSLApp.Client.Workflow;
using jSLCore.Client.Presentation.ApplicationContainer;
using jSLCore.Client.Presentation.Authorization;
using jSLCore.Client.Presentation.BaseControl;
using jSLCore.Client.Presentation.BaseControl.DialogMessage;
using jSLCore.Client.Presentation.jBinding;

namespace jSLApp.Client.Forms
{
    /// <summary>
    /// Music detailed Information Page
    /// </summary>
    public partial class MusicDetail : DataControl
    {
        private readonly int _musicId;
        private readonly bool _autoPlay;

        /// <summary>
        /// Only for Designers
        /// </summary>
        public MusicDetail()
        {
            InitializeComponent();
        }

        public MusicDetail(int musicId,bool autoPlay=false)
        {
            _musicId = musicId;
            _autoPlay = autoPlay;
            InitializeComponent();
        }

        protected override void AcceptButtonClicked()
        {
            PlayCurrent();
        }

        private void PlayCurrent()
        {
            ((MainContentContainer)ParentContentContainer).PlayMusic(Music.FullFileName, Music.AuthorName + " - " + Music.Name, Music.id);
        }

        public override void LoadInitialData()
        {
            DoWork("Загрузка композиции",(sender, args) =>
                                             {
                                                 args.Result = Communication.Proxy.GetMusic(args.Int);
                                             },(o, eventArgs) =>
                                                   {
                                                       if(eventArgs.Error!=null)
                                                       {
                                                           NavigateTo(new ErrorBox("Композиция не найдена"));
                                                           return;
                                                       }
                                                       SetDataContext((Music) eventArgs.Result);
                                                   },_musicId);
        }

        public void SetDataContext(Music music)
        {
            //Провряем пользователя
            //Проверяем Info На пустоту и в случае авторности предлагаем указать
            Music = music;
            
            Bind();
subs.CommentableId = music.id;
            LoadComents();
            if(_autoPlay)
            {
                PlayCurrent();
            }
            //test.UpdateLayout();
        }

        private void LoadComents()
        {
            comments.CommetableId = Music.id;
        }

        public Music Music
        {
            get { return (Music) DataContext; }
            set { DataContext = value; }
        }

        private void publicChange_Clicked(object sender, RoutedEventArgs e)
        {
            if(!Music.Author.IsAllowedToChangeMusic())return;
            var checkBox = (CheckBox)sender;
            var dlg = new QuestionBox("Вы уверены, что хотите изменить параметры публикации",QuestionBoxType.YesNo);
            dlg.ShowDialog(delegate(object o, object data)
                               {
                DoWork("Изменение параметров публикации", (o1, args) =>
                {
                    Communication.Proxy.SaveIsPublic(args.Int, (bool) args.Params[1]);
                    args.Result = args.Params[1];
                }, (sender1, eventArgs) =>
                {
                    if (eventArgs.Error == null)
                    {
                        if((bool) eventArgs.Result)
                        InfoBox.ShowDialog("Композиция опубликована в каталоге");
                        else
                        {
                            InfoBox.ShowDialog("Композиция более не видна в каталоге");
                        }
                    }
                }, Music.id,checkBox.IsChecked);
                               }, null, delegate(object o, EventArgs args)
                                            {
                                                
                                                checkBox.IsChecked = !checkBox.IsChecked;
                                            }, true, this);
        }


        private void downloadChange_Clicked(object sender, RoutedEventArgs e)
        {
            if (!Music.Author.IsAllowedToChangeMusic()) return;
            var checkBox = (CheckBox)sender;
            var dlg = new QuestionBox("Вы уверены, что хотите изменить параметры публикации", QuestionBoxType.YesNo);
            dlg.ShowDialog(delegate(object o, object data)
            {
                DoWork("Изменение параметров публикации", (o1, args) =>
                {
                    Communication.Proxy.ChangeAllowDownload(args.Int, (bool)args.Params[1]);
                    args.Result = args.Params[1];
                }, (sender1, eventArgs) =>
                {
                    if (eventArgs.Error == null)
                    {
                        if ((bool)eventArgs.Result)
                            InfoBox.ShowDialog("Композиция доступна для скачивания");
                        else
                        {
                            InfoBox.ShowDialog("Композиция более не доступна для скачивания");
                        }
                    }
                }, Music.id, checkBox.IsChecked);
            }, null, delegate(object o, EventArgs args)
            {
                checkBox.IsChecked = !checkBox.IsChecked;
            }, true, this);
        }

        private void changePicture_Clicked(object sender, MouseButtonEventArgs e)
        {
            if (!Music.Author.IsAllowedToChangeMusic()) return;

             var dlg = new OpenFileDialog();
             if (dlg.ShowDialog().GetValueOrDefault(false))
             {
                 var stream = dlg.File.OpenRead();
                 if(stream.Length>1000000)
                 {
                     ErrorBox.ShowDialog("Размер файла слишком большой");
                     return;
                 }

                 var bs = new byte[stream.Length];
                 stream.Read(bs, 0, (int) stream.Length);
                 stream.Close();

                 DoWork("Смена изображения",(o, args) =>
                                                {
                                                    Communication.Proxy.ChangeMusicPicture(args.Int,(byte[]) args.Params[1]);
                                                },(sender1, eventArgs) =>
                                                                 {
                                                                     if(eventArgs.Error==null)LoadInitialData();
                                                                 },Music.id,bs);
             }
        }

        private void changeName_Clicked(object sender, MouseButtonEventArgs e)
        {
            if (!Music.Author.IsAllowedToChangeMusic()) return;

            var dlg = new jAskForStringBox("Введите новое название трека:",Music.Name,false);
            dlg.ShowDialog(delegate(object o, object data)
                               {
                                   DoWork("Смена названия",(sender1, args) =>
                                                               {
                                                                   Communication.Proxy.ChangeMusicName(args.Int,(string) args.Params[1]);
                                                               },(o1, eventArgs) =>
                                                                                      {
                                                                                          if(eventArgs.Error==null)
                                                                                          {
                                                                                              LoadInitialData();
                                                                                          }
                                                                                      },Music.id,data);
                               }, this);
        }

        private void track_delete(object sender, RoutedEventArgs e)
        {
            if (!Music.Author.IsAllowedToChangeMusic()) return;

            var dlg = new QuestionBox("Трек будет удален безвозвратно и не будет более доступен на сервере. Продолжить?",QuestionBoxType.OkCancel);
            dlg.ShowDialog(delegate(object o1, object data)
                               {
                                   DoWork((o, args) =>
                                              {
                                                  Communication.Proxy.DeleteMusic(args.Int);
                                              }, (sender1, eventArgs) =>
                                                     {
                                                         if (eventArgs.Error == null)
                                                         {
                                                             InfoBox.ShowDialog("Трек удален с сервера");
                                                             ((MainContentContainer)
                                                              ParentContentContainer).GotoList();
                                                             var dataControl = ((MainContentContainer)
                                                                                ParentContentContainer).CurrentContent as DataControl;
                                                             if (dataControl != null) dataControl.LoadInitialData();
                                                         }
                                                     }, Music.id);
                               }, this);
        }

        private void copyLink_Clicked(object sender, RoutedEventArgs e)
        {
            var hlB = sender as HyperlinkButton;
            Clipboard.SetText(hlB.Content.ToString());
        }

        private void GotoList(object sender, RoutedEventArgs e)
        {
            ((MainContentContainer)ParentContentContainer).GotoList();
        }


        private void changeInfo_Clicked(object sender, MouseButtonEventArgs e)
        {
            if (!Music.Author.IsAllowedToChangeMusic()) return;

            var dlg = new jAskForStringBox("Введите новый коментарий:",Music.Info,true);
            dlg.ShowDialog(delegate(object o, object data)
                               {
                                   DoWork("Смена комментария",(sender1, args) =>
                                                                  {
                                                                      Communication.Proxy.ChangeMusicInfo(args.Int,(string) args.Params[1]);
                                                                  },(o1, eventArgs) =>
                                                                                         {
                                                                                             if(eventArgs.Error==null)
                                                                                             {
                                                                                                 InfoBox.ShowDialog("Комментарий изменен");
                                                                                                 LoadInitialData();
                                                                                             }
                                                                                         },Music.id,data);
                               }, this);
        }

                        

        private void download_Clicked(object sender, RoutedEventArgs e)
        {
            ((MainContentContainer)ParentContentContainer).DownloadMusic(Music.id);
            
        }

        private void goto_Author(object sender, RoutedEventArgs e)
        {
            MainContentContainer.Current.GotoUserAbout(Music.Author);
        }

        private void reloadData_FromComment(object sender, EventArgs e)
        {
            LoadInitialData();
        }

        private void setDone_Clicked(object sender, RoutedEventArgs e)
        {
            var dlg = new QuestionBox("Трек получит статус готовности и будет отображаться в публичном каталоге (если установлен флаг 'публичный'), продолжить?",QuestionBoxType.OkCancel);
            dlg.ShowDialog(delegate(object oz, object data)
                               {
                                   DoWork("Установка готовности трека", (o, args) =>
                                   {
                                       Communication.Proxy.SetDone(args.Int);
                                   }, (sender1, eventArgs) =>
                                   {
                                       if (eventArgs.Error == null)
                                       {
                                           //var checkBox = (CheckBox)sender;
                                           //checkBox.IsEnabled = true; это не вызовет обновления, поэтому используем следующую строку
                                           Music.IsDone = true;
                                       }
                                       else
                                       {
                                           LoadInitialData();
                                       }
                                   }, Music.id);
                               },null,(o1, args1) =>
                                          {
                                              Music.IsDone = false;
                                          },true,this);

            
        }
    }
}
